package com.t.bricks.bussiness.service.loginpast.impl;

import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.t.bricks.bussiness.db.dao.loginpast.LoginPastDao;
import com.t.bricks.bussiness.model.loginpast.ConditionLoginPast;
import com.t.bricks.bussiness.service.loginpast.LoginPastService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.model.OrderInfoList;
import com.t.bricks.utils.function.file.ZipUtil;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 签到'LoginPast表'基本业务操作类接口实现
 */
@Service
public class LoginPastServiceImpl implements LoginPastService {

	@Autowired
	private LoginPastDao loginPastDao;
	
	/**
	 * 登录缓存,注意: 虽然每天都会清理,但只记录程序启动后的添加过的,不对所有登录的进行缓存
	 */
	private StringBuilder cachePast = null;

	/**
	 * 创建Excel文件内容
	 * @param orders 排序数据集合
	 * @param sLikeStr 全文检索
	 * @param condition 查询条件对象
	 * @return 返回结构中data为创建的经过压缩的Excel内容,接收端需要进行解压,msg为文件名
	 */
	@Override
	public MsgEmity export(OrderInfoList orders, String sLikeStr, ConditionLoginPast condition) {
		MsgEmity me = loginPastDao.findByExport(orders, sLikeStr, condition);//查询数据
		if(!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.crateExcel(me.getData(), "签到.xls");//根据Excel的xml模板创建文件内容
		if(!me.isSuccess()) {
			return me;
		}

		MsgEmity msg = ZipUtil.zipStr(me.getData());//将内容进行压缩,便于传输
		if(!msg.isSuccess()) {
			return msg.setData(100 + (Integer)msg.getData());//提升错误码值
		}
		
		return me.setData(msg.getData());//替换成压缩后的内容
	}
	
	//----------------------------- 自动生成代码结束 -----------------------------//

	/**
	 * 取指定时间内签到情况(超级管理员会被排除)
	 * 注意:sName为空则查询所有人(超级管理员还是会被排除)
	 * @param sName 用户名
	 * @param dDateSt 开始时间范围
	 * @param dDateEd 结束时间范围
	 * @return
	 */
	@Override
	public MsgEmity findByDay(String sName, Date dDateSt, Date dDateEd) {
		if (null == sName || "".equals(sName.trim())) {
			sName = null;
		}
		
		if (null == dDateEd) {
			dDateEd = new Date();
		}
		
		if (null == dDateSt) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(dDateEd);
			calendar.add(Calendar.DATE, -15);//日期加15天
			dDateSt = calendar.getTime();
		}
		
		if (dDateSt.after(dDateEd)) {
			return MsgEmity.err(8001, "查询的开始时间比结束时间晚");
		}
		
		return loginPastDao.findByDay(sName, dDateSt, dDateEd);//查询数据
	}
	
	/**
	 * Aop调用的新增登录日志
	 * @param sNameOrNo 登录者使用的用户名或工号
	 * @return
	 */
	@Override
	public MsgEmity addByAop(String sNameOrNo) {
		if (null == sNameOrNo || "".equals(sNameOrNo.trim())) {
			return MsgEmity.err(8001, "登录用户不能为空");
		}
		
		//--检查缓存是否已经有签到记录--//
		if (null == cachePast) {
			cachePast = new StringBuilder(LocalDate.now().toString()).append(";");
		} else {
			String cacheTime = cachePast.substring(0, 10);
			String today = LocalDate.now().toString();
			if (!today.equals(cacheTime)) {
				cachePast.setLength(0);//清除
				cachePast.append(today).append(";");//启用新的一天
			}
		}
		
		if (cachePast.indexOf(String.format("/%s/", sNameOrNo)) > -1) {
			return MsgEmity.success(8999, "已经签到过");
		}
		
		MsgEmity me = loginPastDao.add(sNameOrNo);
		if (!me.isSuccess()) {
			return me;
		}
		
		cachePast.append("/").append(sNameOrNo).append("/");//添加到缓存
		
		return me;
	}
	
	/**
	 * 删除
	 * @Param dDateSt 开始时间范围
	 * @Param dDateEd 结束时间范围
	 * @return
	 */
	@Override
	public MsgEmity del(Date dDateSt, Date dDateEd) {
		if (null == dDateSt && null == dDateEd) {
			return MsgEmity.err(8001, "未设置开始时间和结束时间");
		}
		
		if (null == dDateSt) {
			return MsgEmity.err(8002, "未设置开始时间");
		}
		
		if (null == dDateEd) {
			return MsgEmity.err(8003, "未设置结束时间");
		}
		
		return loginPastDao.del(dDateSt, dDateEd);
	}
	
}
